"""
@Time    : 2025/11/12 21:05
@File    : 探针2smb.py
"""
import socket
import time


def send_tcp_smb_patrol(host, port=445, timeout=5, patrol_count=10, interval=2):
    """
    建立一次TCP连接，巡护发送多次SMB探针，每次发送单独打印日志
    """
    smb_probe = b'\x00\x00\x00\xa4\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x08\x01\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x06\x00\x00\x01\x00\x00\x81\x00\x02PC NETWORK PROGRAM 1.0\x00\x02MICROSOFT NETWORKS 1.03\x00\x02MICROSOFT NETWORKS 3.0\x00\x02LANMAN1.0\x00\x02LM1.2X002\x00\x02Samba\x00\x02NT LANMAN 1.0\x00\x02NT LM 0.12\x00'

    try:
        # 建立TCP连接
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        sock.connect((host, port))
        print(f"✅ 成功建立TCP连接至 {host}:{port}，开始巡护发送（共{patrol_count}次）\n")

        # 巡护发送循环
        for i in range(patrol_count):
            current_num = i + 1
            try:
                # 发送探针
                send_len = sock.send(smb_probe)
                # 单独打印本次发送成功日志
                print(f"[{current_num}/{patrol_count}] 发送成功 - 发送字节数: {send_len}")
            except Exception as e:
                # 单独打印本次发送失败日志
                print(f"[{current_num}/{patrol_count}] 发送失败 - 错误原因: {str(e)}")
                break  # 连接异常时中断巡护

            # 非最后一次发送则添加间隔
            if current_num < patrol_count:
                print(f"[{current_num}/{patrol_count}] 等待{interval}秒后进行下一次发送...\n")

        # 关闭连接
        sock.close()
        print(f"\n📝 巡护结束，已关闭TCP连接")

    except Exception as e:
        print(f"❌ 连接建立失败 - 目标 {host}:{port}，错误原因: {str(e)}")


if __name__ == "__main__":
    target = "127.0.0.1"    # 目标IP
    port = 18730            # 目标端口
    patrol_times = 100       # 巡护次数
    send_interval = 0.001       # 每次发送间隔（秒）

    send_tcp_smb_patrol(
        host=target,
        port=port,
        patrol_count=patrol_times,
        interval=send_interval
    )